home *** CD-ROM | disk | FTP | other *** search
- /*
- HEADER: CUG000.05;
- TITLE: ThreeOpt;
- DATE: Mar 89;
- DESCRIPTION: 3-Opt Tour Improvement Algorithm;
- VERSION: 2.0;
- FILENAME: 3OPT.C;
- SEE-ALSO: TSP.C, NN.C, POPT.C, 2OPT.C, HYBRID.C, FN.C,
- BOOLEAN.H, NODELIST.H, TSP.H,
- BLDMTX.C, PRTMTX.C, TIME.C;
- AUTHORS: Kevin E. Knauss;
- */
-
- #include <nodelist.h>
-
- long ThreeOpt (NumberOfVirteces, Path)
- unsigned NumberOfVirteces;
- NODE *Path;
- {
- unsigned ArcCost();
- long CircuitCost;
- unsigned count, index, pindex, sindex, j, k;
- unsigned D1, D2, D3, D4;
- NODE *First, *Last, *Kth, *Jth, *Save, *Reverse;
-
- count = 1;
- First = Path;
- do {
- Last = First->prior;
- Kth = First->next;
- /* when j = k+1, D1 checks k=1 case (i.e. single point) */
- do {
- Jth = Kth->next;
- /* when j = k+1, D2 checks 2-Opt */
- do {
- D1 = ArcCost (Kth->position, Jth->next->position)
- + ArcCost (First->position, Jth->position);
- D2 = ArcCost (First->position, Jth->next->position)
- + ArcCost (Kth->position, Jth->position);
- D3 = ArcCost (Kth->next->position, Last->position);
- D4 = ArcCost (First->position, Last->position)
- + ArcCost (Kth->position, Kth->next->position)
- + ArcCost (Jth->position, Jth->next->position);
- if (((D1 + D3) < D4) || ((D2 + D3) < D4)) {
- Last->next = Kth->next;
- Kth->next->prior = Last;
- if (D1 <= D2) {
- Kth->next = Jth->next;
- Kth->next->prior = Kth;
- Jth->next = First;
- First->prior = Jth;
- } else {
- for ( Reverse = First; Reverse != Kth; Reverse = Save) {
- Save = Reverse->next;
- Reverse->next = Reverse->prior;
- Reverse->prior = Save;
- }
- First->next = Jth->next;
- Jth->next->prior = First;
- Kth->next = Kth->prior;
- Kth->prior = Jth;
- Jth->next = Kth;
- }
- count = 0;
- First = Last->next;
- Kth = First->next;
- Jth = Kth->next;
- } else
- Jth = Jth->next;
- } while ((Jth != Last->prior) && (count != 0));
- Kth = Kth->next;
- } while ((Kth != Last->prior->prior->prior) && (count != 0));
- if (count != 0)
- First = First->next;
- count++;
- } while (count < NumberOfVirteces);
- Last = First->prior;
- CircuitCost = ArcCost (Last->position, First->position);
- for ( Kth = First; Kth != Last; Kth = Kth->next)
- CircuitCost += ArcCost (Kth->position, Kth->next->position);
- return (CircuitCost);
- } /* ThreeOpt */